using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Package._SceneLayers
{
    /// <summary>
    /// <para>Create Point Cloud Scene Layer Package</para>
    /// <para>Creates a point cloud scene layer package (.slpk file) from LAS, zLAS, LAZ, or LAS dataset input.</para>
    /// <para>根据 LAS、zLAS、LAZ 或 LAS 数据集输入创建点云场景图层包（.slpk 文件）。</para>
    /// </summary>    
    [DisplayName("Create Point Cloud Scene Layer Package")]
    public class CreatePointCloudSceneLayerPackage : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreatePointCloudSceneLayerPackage()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_dataset">
        /// <para>Input Dataset</para>
        /// <para>The lidar data (LAS, zLAS, LAZ, or LAS dataset) that will be used to create a scene layer package. The lidar data can also be specified by selecting the parent folder that contains the desired files.</para>
        /// <para>将用于创建场景图层包的激光雷达数据（LAS、zLAS、LAZ 或 LAS 数据集）。也可以通过选择包含所需文件的父文件夹来指定激光雷达数据。</para>
        /// </param>
        /// <param name="_out_slpk">
        /// <para>Output Scene Layer Package</para>
        /// <para>The output scene layer package (.slpk).</para>
        /// <para>输出场景图层包 （.slpk）。</para>
        /// </param>
        public CreatePointCloudSceneLayerPackage(object _in_dataset, object _out_slpk)
        {
            this._in_dataset = _in_dataset;
            this._out_slpk = _out_slpk;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Create Point Cloud Scene Layer Package";

        public override string CallName => "management.CreatePointCloudSceneLayerPackage";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_dataset, _out_slpk, _out_coor_system, _transform_method, _attributes, _point_size_m, _xy_max_error_m, _z_max_error_m, _in_coor_system, _scene_layer_version.GetGPValue()];

        /// <summary>
        /// <para>Input Dataset</para>
        /// <para>The lidar data (LAS, zLAS, LAZ, or LAS dataset) that will be used to create a scene layer package. The lidar data can also be specified by selecting the parent folder that contains the desired files.</para>
        /// <para>将用于创建场景图层包的激光雷达数据（LAS、zLAS、LAZ 或 LAS 数据集）。也可以通过选择包含所需文件的父文件夹来指定激光雷达数据。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_dataset { get; set; }


        /// <summary>
        /// <para>Output Scene Layer Package</para>
        /// <para>The output scene layer package (.slpk).</para>
        /// <para>输出场景图层包 （.slpk）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Scene Layer Package")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_slpk { get; set; }


        /// <summary>
        /// <para>Output Coordinate System</para>
        /// <para><xdoc>
        ///   <para>The coordinate system of the output scene layer package. It can be any projected or custom coordinate system. Supported geographic coordinate systems include WGS 1984 and China Geodetic Coordinate System 2000. WGS 1984 and EGM96 Geoid are the default horizontal and vertical coordinate systems, respectively. The coordinate system can be specified in any of the following ways:
        ///   <bulletList>
        ///     <bullet_item>Specify the path to a .prj file.  </bullet_item><para/>
        ///     <bullet_item>Reference a dataset with the desired coordinate system.  </bullet_item><para/>
        ///     <bullet_item>Use an arcpy.SpatialReference object.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>输出场景图层包的坐标系。它可以是任何投影坐标系或自定义坐标系。支持的地理坐标系包括 WGS 1984 和中国大地坐标系 2000。WGS 1984 和 EGM96 大地水准面分别是默认的水平坐标系和垂直坐标系。坐标系可以通过以下任一方式指定：
        ///   <bulletList>
        ///     <bullet_item>指定 .prj 文件的路径。</bullet_item><para/>
        ///     <bullet_item>使用所需坐标系引用数据集。</bullet_item><para/>
        ///     <bullet_item>使用 arcpy。SpatialReference 对象。 </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_coor_system { get; set; } = null;


        /// <summary>
        /// <para>Geographic Transformation</para>
        /// <para><xdoc>
        ///   <para>The datum transformation method that will be used when the input layer's coordinate system uses a datum that differs from the output coordinate system. All transformations are bidirectional, regardless of the direction implied by their names. For example, NAD_1927_to_WGS_1984_3 will work correctly even if the datum conversion is from WGS 1984 to NAD 1927.
        ///   <para>ArcGIS coordinate system data is required for vertical datum transformations between ellipsoidal and gravity-related and two gravity-related datums.</para>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>当输入图层的坐标系使用与输出坐标系不同的基准时将使用的基准变换方法。所有转换都是双向的，无论其名称所暗示的方向如何。例如，即使基准面从 WGS 1984 转换为 NAD 1927，NAD_1927_to_WGS_1984_3 也能正常工作。
        ///   <para>椭球体与重力相关基准面以及两个重力相关基准之间的垂直基准变换需要 ArcGIS 坐标系数据。</para>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Geographic Transformation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _transform_method { get; set; } = null;


        /// <summary>
        /// <para>Attributes to cache</para>
        /// <para><xdoc>
        ///   <para>Specifies the source data attributes to be included in the scene layer package. These values will be accessible when the content is consumed in other viewers. Select attributes that are required for the desired rendering and filtering options (for example, intensity, returns, class codes, RGB). To reduce storage, exclude unneeded attributes.</para>
        ///   <bulletList>
        ///     <bullet_item>Intensity— The return strength of the laser pulse for each lidar point.</bullet_item><para/>
        ///     <bullet_item>RGB—RGB imagery information collected for each lidar point.</bullet_item><para/>
        ///     <bullet_item>LAS flags—Classification and scan direction flags.</bullet_item><para/>
        ///     <bullet_item>Classification code—Classification code values.</bullet_item><para/>
        ///     <bullet_item>Return value—Discrete return number from the lidar pulse.</bullet_item><para/>
        ///     <bullet_item>User data—A customizable attribute that can be any number in the range of 0 through 255.</bullet_item><para/>
        ///     <bullet_item>Point source ID—For aerial lidar, this value typically identifies the flight path that collected a given lidar point.</bullet_item><para/>
        ///     <bullet_item>GPS time— The GPS time stamp at which the laser point was emitted from the aircraft. The time is in GPS seconds of the week, where the time stamp is between 0 and 604800 and resets at midnight on a Sunday.</bullet_item><para/>
        ///     <bullet_item>Scan angle—The angular direction of the laser scanner for a given lidar point. The value range is from -90 through 90.</bullet_item><para/>
        ///     <bullet_item>Near infrared—Near infrared records collected for each lidar point.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要包含在场景图层包中的源数据属性。当内容在其他查看器中使用时，将可以访问这些值。选择所需渲染和过滤选项所需的属性（例如，强度、返回值、类代码、RGB）。要减少存储，请排除不需要的属性。</para>
        ///   <bulletList>
        ///     <bullet_item>强度— 每个激光雷达点的激光脉冲返回强度。</bullet_item><para/>
        ///     <bullet_item>RGB - 为每个激光雷达点采集的 RGB 影像信息。</bullet_item><para/>
        ///     <bullet_item>LAS 标志 - 分类和扫描方向标志。</bullet_item><para/>
        ///     <bullet_item>分类代码 - 分类代码值。</bullet_item><para/>
        ///     <bullet_item>返回值 - 来自激光雷达脉冲的离散返回编号。</bullet_item><para/>
        ///     <bullet_item>用户数据 - 可自定义属性，可以是 0 到 255 范围内的任意数字。</bullet_item><para/>
        ///     <bullet_item>点源 ID - 对于航空激光雷达，此值通常用于标识收集给定激光雷达点的飞行路径。</bullet_item><para/>
        ///     <bullet_item>GPS 时间— 从飞机发射激光点的 GPS 时间戳。时间以一周的 GPS 秒为单位，时间戳介于 0 和 604800 之间，并在周日午夜重置。</bullet_item><para/>
        ///     <bullet_item>扫描角度 - 给定激光雷达点的激光扫描仪的角度方向。取值范围为 -90 到 90。</bullet_item><para/>
        ///     <bullet_item>近红外 - 为每个激光雷达点收集的近红外记录。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Attributes to cache")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _attributes { get; set; } = null;


        /// <summary>
        /// <para>Point Size (m)</para>
        /// <para>The point size of the lidar data. For airborne lidar data, the default of 0 or a value close to the average point spacing is usually best. For terrestrial lidar data, the point size should match the desired point spacing for the areas of interest. Values are expressed in meters. The default of 0 will automatically determine the best value for the input dataset.</para>
        /// <para>激光雷达数据的点大小。对于机载激光雷达数据，默认值 0 或接近平均点间距的值通常是最佳。对于地面激光雷达数据，点大小应与感兴趣区域所需的点间距相匹配。值以米表示。默认值为 0 将自动确定输入数据集的最佳值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Point Size (m)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _point_size_m { get; set; } = 0;


        /// <summary>
        /// <para>XY Max Error (m)</para>
        /// <para>The maximum x,y error tolerated. A higher tolerance will result in better data compression and more efficient data transfer. Values are expressed in meters. The default is 0.01.</para>
        /// <para>允许的最大 x，y 错误。更高的容差将导致更好的数据压缩和更高效的数据传输。值以米表示。默认值为 0.01。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("XY Max Error (m)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _xy_max_error_m { get; set; } = 0.01;


        /// <summary>
        /// <para>Z Max Error (m)</para>
        /// <para>The maximum z-error tolerated. A higher tolerance will result in better data compression and more efficient data transfer. Values are expressed in meters. The default is 0.01.</para>
        /// <para>允许的最大 z 误差。更高的容差将导致更好的数据压缩和更高效的数据传输。值以米表示。默认值为 0.01。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Max Error (m)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_max_error_m { get; set; } = 0.01;


        /// <summary>
        /// <para>Input coordinate System</para>
        /// <para>The coordinate system of the input LAZ files. This parameter is only used for LAZ files that do not contain spatial reference information in their header or have a .prj file.</para>
        /// <para>输入 LAZ 文件的坐标系。此参数仅用于标题中不包含空间参考信息或具有 .prj 文件的 LAZ 文件。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_coor_system { get; set; } = null;


        /// <summary>
        /// <para>Scene Layer Version</para>
        /// <para><xdoc>
        ///   <para>The Indexed 3D Scene Layer (I3S) version of the resulting point cloud scene layer package. Specifying a version supports backward compatibility and allows scene layer packages to be shared with earlier versions of ArcGIS.</para>
        ///   <bulletList>
        ///     <bullet_item>1.x—Supported in all ArcGIS clients.</bullet_item><para/>
        ///     <bullet_item>2.x—Supported in ArcGIS Pro 2.1.2 or later and can be published to ArcGIS Online and ArcGIS 10.6.1 or later. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>生成的点云场景图层包的索引 3D 场景图层 （I3S） 版本。指定版本支持向后兼容性，并允许与较早版本的 ArcGIS 共享场景图层包。</para>
        ///   <bulletList>
        ///     <bullet_item>1.x - 在所有 ArcGIS 客户端中都受支持。</bullet_item><para/>
        ///     <bullet_item>2.x - 在 ArcGIS Pro 2.1.2 或更高版本中受支持，并且可以发布到 ArcGIS Online 和 ArcGIS 10.6.1 或更高版本。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Scene Layer Version")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _scene_layer_version_value? _scene_layer_version { get; set; } = null;

        public enum _scene_layer_version_value
        {
            /// <summary>
            /// <para>1.x</para>
            /// <para>1.x—Supported in all ArcGIS clients.</para>
            /// <para>1.x - 在所有 ArcGIS 客户端中都受支持。</para>
            /// </summary>
            [Description("1.x")]
            [GPEnumValue("1.X")]
            value0,

            /// <summary>
            /// <para>2.x</para>
            /// <para>2.x—Supported in ArcGIS Pro 2.1.2 or later and can be published to ArcGIS Online and ArcGIS 10.6.1 or later. This is the default.</para>
            /// <para>2.x - 在 ArcGIS Pro 2.1.2 或更高版本中受支持，并且可以发布到 ArcGIS Online 和 ArcGIS 10.6.1 或更高版本。这是默认设置。</para>
            /// </summary>
            [Description("2.x")]
            [GPEnumValue("2.X")]
            value1,

        }

        public CreatePointCloudSceneLayerPackage SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}